import java.util.ArrayList;
import java.util.List;

/**
 * LeetCode 89. 格雷编码
 */
public class Solution_89 {
    /**
     * 方法二：构造
     * <p>
     * 题解：https://leetcode-cn.com/problems/gray-code/solution/gray-code-jing-xiang-fan-she-fa-by-jyd/
     */
    public List<Integer> grayCode(int n) {
        List<Integer> ans = new ArrayList<Integer>();
        ans.add(0);
        int head = 1;
        for (int i = 0; i < n; i++) {
            for (int j = ans.size() - 1; j >= 0; j--)
                ans.add(head + ans.get(j));
            head <<= 1;
        }
        return ans;
    }

    /**
     * 方法一：公式
     * <p>
     * 格雷码计算公式：G(n) = n xor (n >> 1)
     */
    public List<Integer> grayCode1(int n) {
        List<Integer> ans = new ArrayList<>();
        for (int i = 0; i < 1 << n; i++) {
            ans.add(i ^ (i >> 1));
        }
        return ans;
    }

    /**
     * 计算第 n 个格雷码
     */
    public int gray(int n) {
        return n ^ (n >> 1);
    }
}
